﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//函数指针

//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	int a = Add(2, 3);
//	/*printf("%p\n", Add);
//	printf("%p\n", &Add);*///函数名和&函数名都是函数的地址，没有区别
//
//
//	int (*p) (int, int) = &Add;//p就是一个函数指针，存放函数的地址
//
//	int sum=(*p)(3, 5);//通过函数指针调用函数
//	int s = p(4, 5);
//	int n = (*****p)(5, 5);//在函数指针这里，通过函数指针调用函数，解引用操作符*写不写都可以，因为p存放的是函数地址，
//	//函数名也是函数地址，所以可以认为p和Add等价
//	printf("%d\n", sum);
//	printf("%d\n", s);
//	printf("%d\n", n);
//
//
//	return 0;
//}


//int main()
//{
//	(*(void (*)())0)();//把0强制类型转换为(void (*)())的函数指针类型，并对该指针解引用，调用0地址处的函数
//
//
//	void (*signal(int, void(*)(int)))(int);//这是一个函数的声明，写成这样void(*)(int)  signal   (int, void(*)(int))容易理解
//	//但语法不支持这样写
//
//	//void (*signal(int, void(*)(int)))(int)的简化
//	typedef void(*pfun_t)(int); //将void(*)(int)类型重命名为pfun_t,语法不支持写成typedef void(*)(int) pfun_t(不过这样好理解）
//	pfun_t signal(int, pfun_t);
//	return 0;
//}



//函数指针数组

//int main()
//{
//	int (*parr1[10])();
//	//parr1 先和 [] 结合，说明 parr1是数组，数组的内容是 int (*)() 类型的函数指针。
//	return 0;
//}

	//函数指针数组的用途：转移表
//1
//#include <stdio.h>
//	int add(int a, int b) {
//		return a + b;
//	}
//	int sub(int a, int b) {
//		return a - b;
//	}
//	int mul(int a, int b) {
//		return a * b;
//	}
//	int div(int a, int b) {
//		return a / b;
//	}
//	int main()
//	{
//		int x, y;
//		int input = 1;
//		int ret = 0;
//		do
//		{
//			printf("**************************\n");
//			printf("1.add            2.sub\n" );
//			printf("3.mul            4.div     5.exit\n");
//			printf("* ************************\n");
//			printf("请选择：");
//			scanf("%d", &input);
//			switch (input)
//			{
//			case 1:
//				printf("输入操作数：");
//				scanf("%d %d", &x, &y);
//				ret = add(x, y);
//				printf("ret = %d\n", ret);
//				break;
//			case 2:
//				printf("输入操作数：");
//				scanf("%d %d", &x, &y);
//				ret = sub(x, y);
//				printf("ret = %d\n", ret);
//				break;
//			case 3:
//				printf("输入操作数：");
//				scanf("%d %d", &x, &y);
//				ret = mul(x, y);
//				printf("ret = %d\n", ret);
//				break;
//			case 4:
//				printf("输入操作数：");
//				scanf("%d %d", &x, &y);
//				ret = div(x, y);
//				printf("ret = %d\n", ret);
//				break;
//			case 0:
//				printf("退出程序\n");
//				break;
//			default:
//				printf("选择错误\n");
//				break;
//			}
//		} while (input);
//
//		return 0;
//	}


#include <stdio.h>
	int add(int a, int b) {
		return a + b;
	}
	int sub(int a, int b) {
		return a - b;
	}
	int mul(int a, int b) {
		return a * b;
	}
	int div(int a, int b) {
		return a / b;
	}
	int main()
	{
		int x, y;
		int input = 1;
		int ret = 0;
		int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
		while (input)
		{
			printf("**************************\n");
			printf("1.add            2.sub\n" );
			printf("3.mul            4.div     5.exit\n");
			printf("*************************\n");
			printf("请选择：");
			scanf("%d", &input);
			if ((input <= 4 && input >= 1))
			{
				printf("输入操作数：");
				scanf("%d %d", &x, &y);
				ret = (*p[input])(x, y);
			}
			else
				printf("输入有误\n");
			printf("ret = %d\n", ret);
		}
		return 0;
	}